package com.imaker.utils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

import com.imaker.action.BaseAction;

/**
 * 统一处理系统中的文件上传
 * @author mayh
 *
 */
public class UploadHelper extends BaseAction{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
//	设置缓冲区的大小
	public static int BUFFERE_SIZE = 1024;
	
	/**
	 * 保存上传的图片
	 * @param file
	 * @param type img/icon img为产品图片，icon为小图标。
	 */
	public static void saveImg(File file,String fileName,String type) throws Exception{
//		首先获得上传的文件夹的路径
		String filePath = getPath();
		File imgFile = new File(filePath+"/images/"+type+"/"+fileName);
//		如果存在同名的文件就将其删除
		if(imgFile.exists()){
		   imgFile.delete();
		}
		copyFile(file,imgFile);
	}
	
	/**
	 * 文件拷贝:将源文件拷贝到目的文件
	 * @param srcFile
	 * @param disFile
	 */
	public static void copyFile(File srcFile,File disFile) throws Exception{
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile),BUFFERE_SIZE);
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(disFile),BUFFERE_SIZE);
		byte buffer[] = new byte[BUFFERE_SIZE];
		int len = 0;
		while((len=bis.read(buffer))>0){
			bos.write(buffer,0,len);
		}
		bos.close();
		bis.close();
	 }
	
	/**
	 * 批量上传,此方法要求upload，uploadFileName，uploadContentType，必须一一对应，否则会出现上传文件
	 * 对应信息紊乱
	 * type:icon,小图标 img为产品图片 LOGO 为系统的logo图片
	 * return：已经保存的文件名的集合 List<String> fileName
	 */
	public static List<String> saveImg(List<File> upload,List<String> uploadFileName,List<String> uploadContentType,String type){
		List<String> fileNameList = new ArrayList<String>();
		if(Validate.collectionNotNull(upload)&&Validate.collectionNotNull(uploadFileName)
			&&(upload.size()==uploadFileName.size())){
//			得到上传目录的绝对路径
		String filePath = getPath();
		for(int i=0;i<upload.size();i++){
			String fileName = uploadFileName.get(i);
			String suffixName = getSuffixName(fileName);
//			如果文件的扩展名为空，则跳过此文件
			if("".equals(suffixName))
				continue;
			String newFileName = IDHelper.uuid()+suffixName;
//			首先创建新文件
			File f = new File(filePath+"/images/"+type+"/"+newFileName);
//			将上传的文件拷贝到目标文件夹中
			try {
				copyFile(upload.get(i),f);
			} catch (Exception e) {
				e.printStackTrace();
//				如果保存失败，将文件名设置为ERROR
				fileNameList.add("ERROR");
				continue;
			}
//			将新文件名放入List返回
			fileNameList.add(newFileName);
		}	
		
	}
		return fileNameList;
}
	/**
	 * 得到文件的扩展名
	 * @param fileName
	 * @return
	 */
	private static String getSuffixName(String fileName){
		String fName = "";
		 if(fileName!=null&&!"".equals(fileName)){
			 int index = fileName.lastIndexOf(".");
			 fName = fileName.substring(index);
		 }
		 return fName;
	}
	
	/**
	 * 根据指定类型获得该目录下面的所有文件，但是不包括文件夹，返回值为所有文件的文件名
	 * @param path
	 * @return
	 */
	public static List<String> viewServer(String type){
		List<String> fileNameList = new ArrayList<String>();
		String filePath = getPath()+"/images/"+type;
		File file = new File(filePath);
		File[] serverFiles = file.listFiles();
		for(File f : serverFiles){
			fileNameList.add(f.getName());
		}
		return fileNameList;
	}
}



